#ifndef NOTIFY_QUEUE_H
#define NOTIFY_QUEUE_H
#include"Notify.h"
#include<unordered_map>
#include<queue>
#include<deque>


/*
考虑到消息通知可能比其它通知频繁，因此消息通知的文件和队列单独存放
为每个用户单独创建两份通知文件来存储离线时未读的消息通知

*/
class NotifyQueue{
    using Notify_ptr=unique_ptr<Notify>;
    using Notify_queue=deque<Notify_ptr>;

    private:
        Notify_queue notify_queue;
        NotifyType notify_type; // 通知类型
    public: 
        
        ~NotifyQueue()=default;
        NotifyQueue(NotifyType notify_type=DEFAULT):notify_type(notify_type){};

        NotifyQueue(json j);

        bool add_notify(Notify_ptr notify)noexcept;
        bool send_notify(int socket_fd);

        void unserialize(json& j);

        json serialize();

        NotifyType get_notify_type() const;

        #ifdef DEBUG
        void print_notify_queue() const{
            try{
            for(auto& notify:notify_queue){
                DEBUG_PRINT(notify->serialize().dump(4).c_str());
            }
        }catch(json::exception&e){
            syslog(LOG_ERR, "print_notify_queue error:%s", e.what());
            #ifdef DEBUG
            PRINT_ERRNO_AND_STRERROR(errno, "print_notify_queue error:%s", e.what());
            #endif
            throw e;
        }
        };
        #endif
};



#endif // NOTIFY_QUEUE_H